package com.dragon.design.pattern.structural.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author dragon
 * @version V1.0.0-RELEASE
 * @date 2019/7/1 19:40
 */
public class OrderServiceDynamicProxy implements InvocationHandler {
    private OrderService target;

    /**
     * 通过与目标类相同的类加载器，以及父类的方法签名，动态生成字节码，该字节码，实现了父类的方法，通过里面有一个InvocationHandler的成员变量
     *
     * @param target
     * @return
     */
    public Object getProxy(OrderService target) {
        this.target = target;
        Class clazz = target.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
    }

    /**
     * 当通过代理类去调用实现了父类的方法之后，会通过InvocationHandler成员变量去调用该方法
     *
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("开启事务");
        Object result = method.invoke(target, args);
        System.out.println("提交事务");
        System.out.println("关闭事务");
        return result;
    }
}
